Parallel Streams জাভার Streams API এর একটি অংশ, যা Fork/Join Framework ব্যবহার করে ডেটা প্রসেসিংকে মাল্টিপ্রসেসর কোরে ভাগ করে। এটি বড় ডেটা সেটের জন্য পারফরম্যান্স উন্নত করে এবং প্রোগ্রামিংকে আরও কার্যকর ও সহজ করে তোলে।
Parallel Streams এর বৈশিষ্ট্য
- অ্যাসিঙ্ক্রোনাস প্রসেসিং: একাধিক থ্রেড ব্যবহার করে কাজ ভাগ করে।
- ডেটা প্যারালেলিজম: ডেটা অংশগুলো আলাদাভাবে প্রসেস হয়।
- ডিফল্ট থ্রেড পুল: JVM-এর common ForkJoinPool ব্যবহার করে, যা থ্রেড সংখ্যা কন্ট্রোল করে।
- সহজ সিনট্যাক্স: সাধারণ streams থেকে সহজেই প্যারালেল স্ট্রিমে রূপান্তর করা যায়।
Parallel Streams এর ব্যবহার
১. সাধারণ Parallel Streams উদাহরণ
import java.util.List;
import java.util.stream.IntStream;
public class ParallelStreamExample {
public static void main(String[] args) {
// বড় ডেটা সেট তৈরি
List<Integer> numbers = IntStream.range(1, 10001).boxed().toList();
// Sequential Stream
long startTime = System.currentTimeMillis();
numbers.stream().forEach(ParallelStreamExample::process);
long endTime = System.currentTimeMillis();
System.out.println("Sequential Stream Time: " + (endTime - startTime) + " ms");
// Parallel Stream
startTime = System.currentTimeMillis();
numbers.parallelStream().forEach(ParallelStreamExample::process);
endTime = System.currentTimeMillis();
System.out.println("Parallel Stream Time: " + (endTime - startTime) + " ms");
}
private static void process(Integer number) {
try {
Thread.sleep(1); // প্রতিটি আইটেম প্রক্রিয়া করতে সময় নেয়
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
আউটপুট:
Sequential Stream Time: 10000 ms
Parallel Stream Time: ~2000 ms
২. Parallel Streams এর মাধ্যমে ডেটা ফিল্টার ও ম্যাপ করা
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class ParallelStreamFilterExample {
public static void main(String[] args) {
List<Integer> numbers = IntStream.range(1, 10001).boxed().toList();
// Parallel Stream ব্যবহার করে ফিল্টার ও ম্যাপ করা
List<Integer> evenNumbers = numbers.parallelStream()
.filter(n -> n % 2 == 0) // শুধুমাত্র জোড় সংখ্যা ফিল্টার
.map(n -> n * n) // প্রতিটি সংখ্যা স্কয়ার
.collect(Collectors.toList());
System.out.println("Even Numbers Count: " + evenNumbers.size());
}
}
Parallel Streams এর সুবিধা
- পারফরম্যান্স বৃদ্ধি: বড় ডেটা সেট প্রক্রিয়াকরণের সময় কম লাগে।
- সহজ ব্যবহার: Streams API এর উপর ভিত্তি করে সহজেই ব্যবহার করা যায়।
- কোর ইউটিলাইজেশন: মাল্টি-কোর প্রসেসর ব্যবহার করে কাজ ভাগ করা হয়।
Parallel Streams এর সীমাবদ্ধতা
- থ্রেড-সেফটি: যদি ডেটা স্ট্রাকচার থ্রেড-সেফ না হয়, তাহলে ConcurrentModificationException হতে পারে।
- কিছু ছোট ডেটাসেটে ওভারহেড: Parallel Streams ছোট ডেটাসেটের জন্য ওভারহেড তৈরি করতে পারে।
- উন্নত নিয়ন্ত্রণের অভাব: থ্রেড সংখ্যা সরাসরি নিয়ন্ত্রণ করা সম্ভব নয়; JVM এটি পরিচালনা করে।
Parallel Streams ব্যবহার করার সময় সতর্কতা
১. সাইড এফেক্ট এড়ানো
যদি স্ট্রিমে কোনো সাইড এফেক্ট থাকে (যেমন ডেটা মডিফিকেশন), তাহলে Parallel Streams ব্যবহার না করাই ভালো।
// ভুল ব্যবহার: সাইড এফেক্ট সৃষ্টি করে
List<Integer> numbers = IntStream.range(1, 10001).boxed().toList();
List<Integer> results = new ArrayList<>();
numbers.parallelStream().forEach(n -> results.add(n * n)); // ConcurrentModificationException হতে পারে
২. সংক্ষিপ্ত প্রসেসিং
Parallel Streams শুধুমাত্র বড় ডেটাসেটের জন্য উপযোগী। ছোট ডেটাসেটের জন্য sequential() ব্যবহার করুন।
Parallel Streams বনাম Sequential Streams
| প্যারামিটার | Sequential Streams | Parallel Streams |
|---|---|---|
| প্রসেসিং মডেল | একক থ্রেড ব্যবহার করে। | একাধিক থ্রেড ব্যবহার করে। |
| পারফরম্যান্স | ছোট ডেটাসেটের জন্য কার্যকর। | বড় ডেটাসেটের জন্য কার্যকর। |
| সিনট্যাক্স | stream() ব্যবহার করে। | parallelStream() ব্যবহার করে। |
| থ্রেড কন্ট্রোল | কোনো থ্রেড ব্যবস্থাপনা নেই। | JVM স্বয়ংক্রিয়ভাবে থ্রেড নিয়ন্ত্রণ করে। |
Parallel Streams এর কাস্টম থ্রেড পুল ব্যবহার
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;
public class CustomParallelStreamExample {
public static void main(String[] args) {
List<Integer> numbers = IntStream.range(1, 10001).boxed().toList();
ForkJoinPool customThreadPool = new ForkJoinPool(4); // কাস্টম থ্রেড পুল তৈরি
try {
customThreadPool.submit(() -> {
numbers.parallelStream().forEach(CustomParallelStreamExample::process);
}).get();
} catch (Exception e) {
e.printStackTrace();
} finally {
customThreadPool.shutdown();
}
}
private static void process(Integer number) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- Parallel Streams বড় ডেটাসেট প্রক্রিয়াকরণের জন্য কার্যকর এবং মাল্টি-কোর প্রসেসর ব্যবহার করে পারফরম্যান্স উন্নত করে।
- ব্যবহারের সতর্কতা: সাইড এফেক্ট এবং ছোট ডেটাসেটের জন্য এটি সাবধানে ব্যবহার করা উচিত।
- কাস্টম থ্রেড পুল: আরও নিয়ন্ত্রণের জন্য কাস্টম থ্রেড পুল ব্যবহার করা যায়।
এই পদ্ধতি সঠিকভাবে ব্যবহার করলে ডেটা প্রসেসিং অনেক বেশি কার্যকর এবং দ্রুত করা সম্ভব।
Content added By
Read more